package com.edu.exam.enums.curriculum.questionbank;

import com.edu.exam.enums.core.BaseEnum;

/**
 * 题库类型枚举
 *
 * 从QuestionBank.BankType迁移而来
 * 定义考试系统中题库的类型，用于区分不同用途和性质的题库
 *
 * @author System
 * @version 1.0.0
 */
public enum QuestionBankType implements BaseEnum {

    /**
     * 公共题库 - 面向所有用户的通用题库
     */
    PUBLIC("PUBLIC", "公共题库"),

    /**
     * 私有题库 - 仅限特定用户或组织访问的题库
     */
    PRIVATE("PRIVATE", "私有题库"),

    /**
     * 学院题库 - 特定学院使用的题库
     */
    COLLEGE("COLLEGE", "学院题库"),

    /**
     * 专业题库 - 特定专业使用的题库
     */
    MAJOR("MAJOR", "专业题库"),

    /**
     * 课程题库 - 特定课程使用的题库
     */
    COURSE("COURSE", "课程题库"),

    /**
     * 院系统一题库 - 整个院系统一使用的题库
     */
    DEPARTMENT("DEPARTMENT", "院系统一题库"),

    /**
     * 学校题库 - 整个学校使用的题库
     */
    SCHOOL("SCHOOL", "学校题库"),

    /**
     * 临时题库 - 临时创建的题库，通常用于特定考试
     */
    TEMPORARY("TEMPORARY", "临时题库"),

    /**
     * 模板题库 - 作为模板使用的题库
     */
    TEMPLATE("TEMPLATE", "模板题库"),

    /**
     * 共享题库 - 多个组织或用户共享的题库
     */
    SHARED("SHARED", "共享题库"),

    /**
     * 外部题库 - 从外部系统导入的题库
     */
    EXTERNAL("EXTERNAL", "外部题库"),

    /**
     * 官方题库 - 官方认证的标准题库
     */
    OFFICIAL("OFFICIAL", "官方题库"),

    /**
     * 实验题库 - 用于实验或测试的题库
     */
    EXPERIMENTAL("EXPERIMENTAL", "实验题库"),

    /**
     * 归档题库 - 已归档的历史题库
     */
    ARCHIVED("ARCHIVED", "归档题库");

    private final String code;
    private final String description;

    QuestionBankType(String code, String description) {
        this.code = code;
        this.description = description;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDescription() {
        return description;
    }

    public static QuestionBankType fromCode(String code) {
        if (code == null || code.trim().isEmpty()) {
            throw new IllegalArgumentException("QuestionBankType code cannot be null or empty");
        }

        for (QuestionBankType type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        throw new IllegalArgumentException("Unknown QuestionBankType code: " + code);
    }

    public static QuestionBankType fromDescription(String description) {
        if (description == null || description.trim().isEmpty()) {
            throw new IllegalArgumentException("QuestionBankType description cannot be null or empty");
        }

        for (QuestionBankType type : values()) {
            if (type.getDescription().equals(description)) {
                return type;
            }
        }
        throw new IllegalArgumentException("Unknown QuestionBankType description: " + description);
    }

    @Override
    public String toString() {
        return this.code + "(" + this.description + ")";
    }
}